/**
 * @defgroup TestException 关于Java异常机制的例子
 * @author 李焕帅
 * @version 0.1
 * @date 30/07/2012
 * @{
 */
/**
 * @name 包定义
 * @{
 */
package indd.lihs.basic.javabasictester;

import java.util.*;

/** @}*/
// 包定义

/**
 * @name 测试类型定义
 * @{
 */
public class TestException
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n
     *       则系统直接退出该方法,并将异常发回给调用者其中,如果父类的方法没有声明\n
     *       某种必检异常,子类进行方法覆盖时,也不能声明
     */
    public static void main(String[] args) throws Ex
    {
        /* 被除数 */
        int num1 = 0;
        /* 除数 */
        int num2 = 0;
        /* 输入错误1 */
        boolean inputError1 = true;
        /* 输入错误2 */
        boolean inputError2 = true;
        /* 输入流 */
        Scanner cin = new Scanner(System.in);

        do // 演示1
        {
            try
            {
                System.out.print("输入一个整数的被除数: ");
                num1 = cin.nextInt();
                inputError1 = false; // 出现异常时此句被跳过,无法终止循环
            }
            catch (InputMismatchException ex)
            { // 此处捕获RuntimeException的一个子类,如果用catch(Exception ex)可
              // 捕获所有异常
                System.out.println("输入错误,请输入一个整数: ");
                cin.nextLine(); // 跳到当前输入行的输入信息
            }
            /*
             * 可添加finally块, 不管一场发生与否, 都执行该块
             */
        } while (inputError1);

        do // 演示2
        {
            try
            {
                System.out.print("请输入一个整数的除数: ");
                num2 = cin.nextInt();
                int num3 = devide(num1, num2);
                inputError2 = false;
                System.out.println(num1 + " / " + num2 + " = " + num3);
            }
            catch (InputMismatchException ex)
            {
                System.out.println("输入错误,请输入一个整数: ");
                cin.nextLine(); // 跳到当前输入行的输入信息
            }
            /* 此处捕获RuntimeException的一个子类 */
            catch (ArithmeticException ex)
            {
                System.out.println("输入错误, 除数不能为零");
                cin.nextLine();
            }
        } while (inputError2);

        // method(); //演示必检异常的默认处理过程
        cin.close(); // 关闭输入流
    }

    /**
     * 数学除法函数
     * @param[in] num1 被除数
     * @param[in] num2 除数
     * @return int
     * @note 当除数或被除数中有一个是浮点数时, 被零除不是非法的只是会溢出为\n
     *       无穷大 (特殊浮点常量POSTIVE_INFINITY,NEGATIVE_INFINITY)或\n
     *       无穷小(NaN非数字), 但整数零被除是非法的
     */
    private static int devide(int num1, int num2) throws ArithmeticException
    { /* 系统定义的异常可以不必显式声明throw */
        return (num1 / num2);
    }

    // /**
    // * 显示抛出异常
    // * @param[in] void
    // * @return void
    // * @note 静态成员,显式抛出必检异常
    // */
    // private static void method() throws Ex
    // {/* 必检异常必须声明 */
    // throw (new Ex());
    // }

}

/** @}*/
// 测试类型定义

/**
 * @name 异常类定义
 * @{
 */
/**
 * @belief Java异常类的派生类
 * @see java.lang.Exception
 */
class Ex extends Exception
{
    private static final long serialVersionUID = 1L;
}

/** @}*/
// 异常类定义

/** @}*/
// 模块定义
